GdkEventKey *event);
static void gtk_range_state_flags_changed (GtkWidget *widget,
GtkStateFlags previous_state);
+static void gtk_range_direction_changed (GtkWidget *widget,
+ GtkTextDirection previous_direction);
static void gtk_range_measure_trough (GtkCssGadget *gadget,
GtkOrientation orientation,
gint for_size,
widget_class->scroll_event = gtk_range_scroll_event;
widget_class->key_press_event = gtk_range_key_press;
widget_class->state_flags_changed = gtk_range_state_flags_changed;
+ widget_class->direction_changed = gtk_range_direction_changed;
class->move_slider = gtk_range_move_slider;
class->change_value = gtk_range_real_change_value;
}
}
+static gboolean
+should_invert (GtkRange *range)
+{
+ GtkRangePrivate *priv = range->priv;
+
+ if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+ return
+ (priv->inverted && !priv->flippable) ||
+ (priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_LTR) ||
+ (!priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_RTL);
+ else
+ return priv->inverted;
+}
+
+static void
+update_highlight_position (GtkRange *range)
+{
+ GtkRangePrivate *priv = range->priv;
+
+ if (!priv->highlight_gadget)
+ return;
+
+ if (should_invert (range))
+ {
+ gtk_css_gadget_remove_class (priv->highlight_gadget, GTK_STYLE_CLASS_TOP);
+ gtk_css_gadget_add_class (priv->highlight_gadget, GTK_STYLE_CLASS_BOTTOM);
+ }
+ else
+ {
+ gtk_css_gadget_remove_class (priv->highlight_gadget, GTK_STYLE_CLASS_BOTTOM);
+ gtk_css_gadget_add_class (priv->highlight_gadget, GTK_STYLE_CLASS_TOP);
+ }
+}
+
+static void
+update_fill_position (GtkRange *range)
+{
+ GtkRangePrivate *priv = range->priv;
+
+ if (!priv->fill_gadget)
+ return;
+
+ if (should_invert (range))
+ {
+ gtk_css_gadget_remove_class (priv->fill_gadget, GTK_STYLE_CLASS_TOP);
+ gtk_css_gadget_add_class (priv->fill_gadget, GTK_STYLE_CLASS_BOTTOM);
+ }
+ else
+ {
+ gtk_css_gadget_remove_class (priv->fill_gadget, GTK_STYLE_CLASS_BOTTOM);
+ gtk_css_gadget_add_class (priv->fill_gadget, GTK_STYLE_CLASS_TOP);
+ }
+}
+
static void
update_stepper_state (GtkRange *range,
Stepper stepper,
priv->inverted = setting;
update_steppers_state (range);
+ update_fill_position (range);
+ update_highlight_position (range);
+
gtk_widget_queue_resize (GTK_WIDGET (range));
g_object_notify_by_pspec (G_OBJECT (range), properties[PROP_INVERTED]);
if (flippable != priv->flippable)
{
priv->flippable = flippable;
+ update_fill_position (range);
+ update_highlight_position (range);
gtk_widget_queue_allocate (GTK_WIDGET (range));
}
NULL, NULL);
gtk_css_gadget_set_state (priv->fill_gadget,
gtk_css_node_get_state (gtk_css_gadget_get_node (priv->trough_gadget)));
+
+ update_fill_position (range);
}
else
{
return range->priv->fill_level;
}
-static gboolean
-should_invert (GtkRange *range)
-{
- GtkRangePrivate *priv = range->priv;
-
- if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
- return
- (priv->inverted && !priv->flippable) ||
- (priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_LTR) ||
- (!priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_RTL);
- else
- return priv->inverted;
-}
-
static void
gtk_range_destroy (GtkWidget *widget)
{
gtk_css_gadget_set_state (priv->fill_gadget, state);
}
+static void
+gtk_range_direction_changed (GtkWidget *widget,
+ GtkTextDirection previous_direction)
+{
+ GtkRange *range = GTK_RANGE (widget);
+
+ update_fill_position (range);
+ update_highlight_position (range);
+
+ GTK_WIDGET_CLASS (gtk_range_parent_class)->direction_changed (widget, previous_direction);
+}
+
static void
gtk_range_state_flags_changed (GtkWidget *widget,
GtkStateFlags previous_state)
NULL, NULL);
gtk_css_gadget_set_state (priv->highlight_gadget,
gtk_css_node_get_state (gtk_css_gadget_get_node (priv->trough_gadget)));
+
+ update_highlight_position (range);
}
else
{